package sad.dao;

import com.db4o.ObjectSet;
import com.db4o.query.Query;
import sad.modelo.Disciplina;
import sad.modelo.Topico;
import sad.util.Constantes;
import sad.util.DAOEvent;
import sad.visao.TopicoTableModel;

public class TopicoTableDAO extends AbstractDAO {
    
  private static TopicoTableDAO INSTANCE=null;
  private static TopicoTableModel tableModel;
  private static int indexTop;
  
  //singleton
  public static TopicoTableDAO getInstance(){
        if (TopicoTableDAO.INSTANCE ==null){
            TopicoTableDAO.INSTANCE = new TopicoTableDAO();
        }
        return TopicoTableDAO.INSTANCE;
    }
    
  //C(reate)R(etrieve)U(pdate)D(elete)

  public static void create(){
        tableModel = new TopicoTableModel();
        Query query = DAO.getObjectContainer().query();
        query.constrain(Topico.class);
        query.descend("nome").orderAscending();
        ObjectSet produtoList = query.execute();
    
        while(produtoList.hasNext()) {
            Topico proto = (Topico)produtoList.next();
            tableModel.addTopico(proto);
        }
        tableModel.sortByNome();
  }
  
  public void create(String nome, String ab, Disciplina disc){

        Topico t = new Topico();
        t.setNome(nome);
        t.setAbrev(ab);
        t.setDisc(disc);
        if(DAO.create(t)){
            addTopico(t);
        }else{
            TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(t.getNome(), DAOEvent.DAO_NOCREATE));
        }
   }
  
    public void addTopico(Topico top) {
        //verifica se o primeiro professor foi adicionado e avisa aos ouvintes
        //sadgui deve habilitar menu subtopico
        int size = DAO.getListObjects(top).length;
        if(size==1){
                ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(Constantes.SUBTOPICO, DAOEvent.DAO_FIRST));
        }
        //se existe uma tabela
        if (tableModel!=null){
            //add prof
            tableModel.addTopico(top);
            //organiza pelo nome
            tableModel.sortByNome();
        }
        //avisa aos ouvintes que um professor foi criado com sucesso
        TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(top, top.getAbrev(), DAOEvent.DAO_CREATE));
    }

    public boolean isExist(String abrev) {
        boolean existe = false;
        Topico proto = new Topico();
        proto.setAbrev(abrev);
        Topico top = (Topico)DAO.retrieve(proto);
        if(top != null){
             existe =true;
             TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(abrev, DAOEvent.DAO_EXISTE));
        }
        return existe;
    }

    public static Topico getTopicoSaved(String nome) {
        Topico proto = new Topico();
        proto.setAbrev(nome);
        return (Topico) DAO.retrieve(proto);
    }
  
    public TopicoTableModel getTableTopico() {
        return tableModel;
    }

    public void removeTopico() {
        Topico top = tableModel.getTopico(getIndexTop());
        TopicoTableDAO.getInstance().delete(top);
        tableModel.removeTopico(getIndexTop());
        
        //Se for apagado tudo na tabela, avisa para o controle que o GUI geral deve ser atualizada
        // (o Subtópico deve ser desabilitado)
        if(tableModel.getRowCount()==0){
            TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(Constantes.SUBTOPICO, DAOEvent.DAO_NULL));
        }
        
        TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(getIndexTop(), DAOEvent.DAO_DELETE));
    }

    public void removeAllTopico(Disciplina d) {
        Topico proto = new Topico();
        proto.setDisc(d);
        Topico top = (Topico)DAO.retrieve(proto);
        if(top != null){
             TopicoTableDAO.getInstance().delete(top);
             TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(top, DAOEvent.DAO_EXISTE));
        }
    }  
    public void setIndexTop(int index) {
        //seta o index do prof selecionado na tabela
        indexTop=index;
    }
    
    public int getIndexTop() {
        //retorna o index do prof selecionada na tabela
        return indexTop;
    }
    
    public void update(Topico t){
        //atualiza o banco (create igual a update)
        if(DAO.create(t)){
            //atualiza os valores editados na tabela
            tableModel.setValueAt(t, getIndexTop(), 0);
            tableModel.setValueAt(t, getIndexTop(), 1);
            tableModel.setValueAt(t, getIndexTop(), 2);
            tableModel.sortByNome();
            //avisa a gui da atualização
            TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(t.getAbrev(), DAOEvent.DAO_UPDATE));
        }else{
            TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(t.getAbrev(), DAOEvent.DAO_NOCREATE));
        }
    }
}